# coding:utf-8

import os
import time
import multiprocessing


def work(count, lock):
    lock.acquire()  # 可以阻塞或非阻塞地获得锁
    print(count, os.getpid())
    time.sleep(5)
    lock.release()  # 释放锁，可以在任何进程、线程使用，并不限于锁的拥有者。
    return 'result is %s, pid is %s' % (count, os.getpid())


if __name__ == '__main__':
    pool = multiprocessing.Pool(5)  # Pool 类表示一个工作进程池。
    manager = multiprocessing.Manager()  # 返回一个已启动的 SyncManager 管理器对象，这个对象可以用于在不同进程中共享数据。
    lock = manager.Lock()  # 创建一个共享的 threading.Lock 对象并返回它的代理。
    results = []
    for i in range(20):
        result = pool.apply_async(func=work, args=(i, lock))  # apply() 方法的一个变种，返回一个 AsyncResult 对象。
        # results.append(result)

    # for res in results:
    #     print(res.get())

    pool.close()  # 阻止后续任务提交到进程池，当所有任务执行完成后，工作进程会退出。
    pool.join()  # 等待工作进程结束。调用 join() 前必须先调用 close() 或者 terminate() 。
